home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Just Call Me Internet
/
Just Call Me Internet.iso
/
com
/
internet
/
stik
/
gluestik
/
testit.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-01-07
|
15KB
|
561 lines
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <osbind.h>
#include <mintbind.h>
#include <time.h>
#include <errno.h>
#include <sys/time.h>
#include <sys/types.h>
#include "drivers.h"
#include "transprt.h"
/* These definitions are necessary. transprt.h has external
* declarations for them.
*/
DRV_LIST *drivers = (DRV_LIST *)NULL;
TPL *tpl = (TPL *)NULL;
/* Put 'STIK' cookie value into drivers */
typedef struct {
long cktag;
long ckvalue;
} ck_entry;
static long init_drivers(void)
{
long i = 0;
ck_entry *jar = *((ck_entry **) 0x5a0);
while (jar[i].cktag) {
if (!strncmp((char *)&jar[i].cktag, CJTAG, 4)) {
drivers = (DRV_LIST *)jar[i].ckvalue;
return (0);
}
++i;
}
return (0); /* Pointless return value... */
}
void errtext_test(void)
{
static int errs[] = {E_NORMAL, E_EOF, E_BADHANDLE, E_CONNECTFAIL,
-1000 - EWOULDBLOCK, -1000 - ENOMEM, E_NOMEM,
-999};
int n;
char *s;
printf("\nTesting error messages...\n");
printf("\t[get_err_text = %p]\n", (void *)(tpl->get_err_text));
for (n = 0; n < sizeof(errs)/sizeof(int); n++) {
s = get_err_text(errs[n]);
printf("get_err_text(%d) returned \"%s\"\n", errs[n], (s?s:"<<<NULL>>>"));
}
}
void stikvar_test(void)
{
static char *vars[] = {"ALLOCMEM", "CDVALID", "BOGUSVAR"};
int n;
char *s;
printf("\nTesting STiK config vars...\n");
printf("\t[getvstr = %p]\n", (void *)(tpl->getvstr));
for (n = 0; n < sizeof(vars)/sizeof(char *); n++) {
s = getvstr(vars[n]);
printf("getvstr(\"%s\") returns \"%s\"\n", vars[n], (s?s:"<<<NULL>>>"));
}
}
void mem_test(void)
{
char *mem1, *mem2, *mem3, *mem0;
static char data[] = "Some test data";
printf("\nTesting the memory pool...\n");
printf("\t[KRmalloc = %p]\n", (void *)(tpl->KRmalloc));
printf("\t[KRfree = %p]\n", (void *)(tpl->KRfree));
printf("\t[KRgetfree = %p]\n", (void *)(tpl->KRgetfree));
printf("\t[KRrealloc = %p]\n", (void *)(tpl->KRrealloc));
printf("%ld bytes free, largest block %ld bytes\n",
KRgetfree(0), KRgetfree(1));
mem1 = KRmalloc(50);
printf("First KRmalloc(50) returns %p\n", (void *)mem1);
mem2 = KRmalloc(50);
printf("Second KRmalloc(50) returns %p\n", (void *)mem2);
mem3 = KRmalloc(50);
printf("Third KRmalloc(50) returns %p\n", (void *)mem3);
printf("%ld bytes free, largest block %ld bytes\n",
KRgetfree(0), KRgetfree(1));
KRfree(mem2);
printf("Freed second block; now %ld bytes free, largest block %ld bytes\n",
KRgetfree(0), KRgetfree(1));
strcpy(mem1, data);
mem0 = KRrealloc(mem1, 80);
printf("KRrealloc(80) on first block returns %p (should not have "
"changed%s)\n",
mem0, (mem0 == mem1 ? "" : " --- ERROR"));
printf("Contents of first block has%s changed\n",
(strcmp(mem0, data) ? "" : " not"));
printf("Now %ld bytes free, largest block %ld bytes\n",
KRgetfree(0), KRgetfree(1));
mem1 = mem0;
mem0 = KRrealloc(mem1, 150);
printf("KRrealloc(150) on first block returns %p (should have "
"changed%s)\n",
mem0, (mem0 != mem1 ? "" : " --- ERROR"));
printf("Contents of first block has %s\n",
(strcmp(mem0, data) ? "changed --- ERROR" : "not changed"));
printf("Now %ld bytes free, largest block %ld bytes\n",
KRgetfree(0), KRgetfree(1));
mem2 = KRrealloc(NULL, 85);
printf("KRrealloc(NULL, 85) returns %p (should be where first block "
"originally was%s)\n",
mem2, (mem2 == mem1 ? "" : " --- ERROR"));
printf("New block was %s\n", (*mem2 ? "not erased --- ERROR" : "erased"));
printf("Now %ld bytes free, largest block %ld bytes\n",
KRgetfree(0), KRgetfree(1));
KRfree(mem0);
KRfree(mem2);
KRfree(mem3);
printf("All blocks freed; now %ld bytes free, largest block %ld bytes\n",
KRgetfree(0), KRgetfree(1));
}
void resolver_test(void)
{
char *realname;
unsigned long addrs[5];
int n, i, j;
static char *names[] = {"localhost", "goldfinch.cs.duke.edu",
"www.w3.org", "bogus.address"};
printf("\nTesting the DNS resolver...\n");
printf("\t[resolve = %p]\n", (void *)(tpl->resolve));
for (j = 0; j < sizeof(names)/sizeof(char *); j++) {
n = resolve(names[j], &realname, addrs, 5);
if (n < 0) {
printf("resolve(\"%s\") returned error code %d: %s\n",
names[j], n, get_err_text(n));
} else {
printf("resolve(\"%s\") returned %d addresses: ",
names[j], n);
for (i = 0; i < n; i++)
printf(" %lu.%lu.%lu.%lu", addrs[i]>>24, (addrs[i]>>16)&0xFFL,
(addrs[i]>>8)&0xFFL, addrs[i]&0xFFL);
printf("\n\tReal hostname was %s\n", realname);
KRfree(realname);
}
}
}
void tcp_test(void)
{
unsigned long hostaddr;
int fd, ret, nchars = 0;
NDB *N;
static char finger_host[] = "goldfinch.cs.duke.edu",
finger_name[] = "dsb\r\n";
char buf[10];
printf("\nTesting the TCP functions...\n");
printf("\t[TCP_open = %p]\n", (void *)(tpl->TCP_open));
printf("\t[TCP_close = %p]\n", (void *)(tpl->TCP_close));
printf("\t[TCP_send = %p]\n", (void *)(tpl->TCP_send));
printf("\t[CNbyte_count = %p]\n", (void *)(tpl->CNbyte_count));
printf("\t[CNget_char = %p]\n", (void *)(tpl->CNget_char));
printf("\t[CNget_block = %p]\n", (void *)(tpl->CNget_block));
printf("\t[CNget_NDB = %p]\n", (void *)(tpl->CNget_NDB));
ret = resolve(finger_host, NULL, &hostaddr, 1);
if (ret < 0) {
printf("resolve(\"%s\") returned error code %d: %s\n",
finger_host, ret, get_err_text(ret));
return;
}
fd = TCP_open(hostaddr, 79, 0, 0);
if (fd < 0) {
printf("TCP_open() returned error code %d: %s\n", fd, get_err_text(fd));
return;
} else {
printf("TCP_open() returns socket handle %d\n", fd);
}
ret = TCP_send(fd, finger_name, strlen(finger_name));
if (ret < 0) {
printf("TCP_send() returned error code %d: %s\n", ret, get_err_text(ret));
TCP_close(fd, 0);
return;
}
ret = CNbyte_count(fd);
if (ret < 0) {
printf("CNbyte_count() returned error code %d: %s\n", ret, get_err_text(ret));
} else {
printf("CNbyte_count() reports %d bytes waiting on socket %d\n",
ret, fd);
}
ret = CNget_block(fd, buf, 10); /* should be able to get at least
this much */
if (ret < 0) {
printf("CNget_block() returned error code %d: %s\n", ret, get_err_text(ret));
} else {
printf("CNget_block() read %d bytes from socket %d\n", ret, fd);
}
{
int ret2 = CNbyte_count(fd);
if (ret2 < 0) {
printf("CNbyte_count() returned error code %d: %s\n",
ret2, get_err_text(ret2));
} else {
printf("Now, CNbyte_count() reports %d bytes waiting on socket %d\n",
ret2, fd);
}
}
N = CNget_NDB(fd);
if (!N) {
printf("CNget_NDB() read nothing\n");
} else {
printf("CNget_NDB() read %u bytes from socket %d\n", N->len, fd);
}
/* Now, print whatever these two managed to read and get the rest with
CNget_char(). */
if (ret > 0)
printf("%.*s", ret, buf);
if (N) {
printf("%.*s", (int)N->len, N->ndata);
if (N->ptr)
KRfree(N->ptr);
KRfree((char *)N);
}
for (;;) {
ret = CNget_char(fd);
if (ret == E_EOF)
break;
if (ret == E_NODATA)
continue;
if (ret < 0) {
printf("\nCNget_char() returned error code %d: %s\n",
ret, get_err_text(ret));
break;
}
nchars++;
putchar(ret);
}
printf("\nRead %d bytes via CNget_char()\n", nchars);
ret = CNbyte_count(fd);
if (ret < 0) {
printf("After EOF, CNbyte_count() returned error code %d: %s\n",
ret, get_err_text(ret));
} else {
printf("After EOF, CNbyte_count() reports %d bytes waiting on socket %d\n",
ret, fd);
}
ret = Finstat(fd);
if (ret < 0) {
printf("After EOF, Finstat() returned error code %d: %s\n",
ret, strerror(-ret));
} else {
printf("After EOF, Finstat() reports %d bytes waiting on socket %d\n",
ret, fd);
}
{
fd_set except_set;
struct timeval T;
FD_ZERO(&except_set);
FD_SET(fd, &except_set);
T.tv_sec = T.tv_usec = 0;
ret = select(fd + 1, NULL, NULL, &except_set, &T);
if (ret > 0) {
printf("After EOF, select() reported exceptional state on socket %d\n",
fd);
} else if (ret == 0) {
printf("After EOF, select() did not report exceptional state on socket %d\n",
fd);
} else {
printf("After EOF, select() returned error code %d: %s\n", errno,
strerror(errno));
}
}
ret = TCP_close(fd, 0);
if (ret < 0) {
printf("TCP_close(%d) returned error code %d: %s\n",
fd, ret, get_err_text(ret));
}
}
void NDB_test(void)
{
unsigned long hostaddr;
int fd, ret;
NDB *N;
static char finger_host[] = "goldfinch.cs.duke.edu",
finger_name[] = "dsb\r\n";
printf("\nTesting the TCP functions, with CNget_NDB() reads...\n");
printf("\t[TCP_open = %p]\n", (void *)(tpl->TCP_open));
printf("\t[TCP_close = %p]\n", (void *)(tpl->TCP_close));
printf("\t[TCP_send = %p]\n", (void *)(tpl->TCP_send));
printf("\t[CNbyte_count = %p]\n", (void *)(tpl->CNbyte_count));
printf("\t[CNget_NDB = %p]\n", (void *)(tpl->CNget_NDB));
ret = resolve(finger_host, NULL, &hostaddr, 1);
if (ret < 0) {
printf("resolve(\"%s\") returned error code %d: %s\n",
finger_host, ret, get_err_text(ret));
return;
}
fd = TCP_open(hostaddr, 79, 0, 0);
if (fd < 0) {
printf("TCP_open() returned error code %d: %s\n", fd, get_err_text(fd));
return;
} else {
printf("TCP_open() returns socket handle %d\n", fd);
}
{
fd_set rfd, wfd;
struct timeval T;
FD_ZERO(&rfd);
FD_SET(fd, &rfd);
FD_ZERO(&wfd);
FD_SET(fd, &wfd);
T.tv_sec = T.tv_usec = 0;
ret = select(fd + 1, &rfd, &wfd, NULL, &T);
if (ret > 0) {
printf("Initially, select() reported %s state on socket %d\n",
(FD_ISSET(fd, &rfd) && FD_ISSET(fd, &wfd) ? "read and write" :
FD_ISSET(fd, &rfd) ? "read" :
FD_ISSET(fd, &wfd) ? "write" : "strange"),
fd
);
} else if (ret == 0) {
printf("Initially, select() reported no read or write state on socket %d\n",
fd);
} else {
printf("Initially, select() returned error code %d: %s\n", errno,
strerror(errno));
}
}
ret = TCP_send(fd, finger_name, strlen(finger_name));
if (ret < 0) {
printf("TCP_send() returned error code %d: %s\n", ret, get_err_text(ret));
TCP_close(fd, 0);
return;
}
ret = CNbyte_count(fd);
if (ret < 0) {
printf("CNbyte_count() returned error code %d: %s\n", ret, get_err_text(ret));
} else {
printf("CNbyte_count() reports %d bytes waiting on socket %d\n",
ret, fd);
}
for (;;) {
N = CNget_NDB(fd);
if (N) {
printf("%.*s", (int)N->len, N->ndata);
if (N->ptr)
KRfree(N->ptr);
KRfree((char *)N);
}
ret = CNbyte_count(fd);
if (ret < 0 && ret != E_NODATA) {
break;
}
}
if (ret < 0) {
printf("After EOF, CNbyte_count() returned error code %d: %s\n",
ret, get_err_text(ret));
} else {
printf("After EOF, CNbyte_count() reports %d bytes waiting on socket %d\n",
ret, fd);
}
ret = Finstat(fd);
if (ret < 0) {
printf("After EOF, Finstat() returned error code %d: %s\n",
ret, strerror(-ret));
} else {
printf("After EOF, Finstat() reports %d bytes waiting on socket %d\n",
ret, fd);
}
{
fd_set rfd, wfd;
struct timeval T;
FD_ZERO(&rfd);
FD_SET(fd, &rfd);
FD_ZERO(&wfd);
FD_SET(fd, &wfd);
T.tv_sec = T.tv_usec = 0;
ret = select(fd + 1, &rfd, &wfd, NULL, &T);
if (ret > 0) {
printf("After EOF, select() reported %s state on socket %d\n",
(FD_ISSET(fd, &rfd) && FD_ISSET(fd, &wfd) ? "read and write" :
FD_ISSET(fd, &rfd) ? "read" :
FD_ISSET(fd, &wfd) ? "write" : "strange"),
fd
);
} else if (ret == 0) {
printf("After EOF, select() did not report read or write state on socket %d\n",
fd);
} else {
printf("After EOF, select() returned error code %d: %s\n", errno,
strerror(errno));
}
}
ret = TCP_close(fd, 0);
if (ret < 0) {
printf("TCP_close(%d) returned error code %d: %s\n",
fd, ret, get_err_text(ret));
}
}
void CIB_test(void)
{
CIB *C;
unsigned long hostaddr;
int fd, ret;
static char host_name[] = "goldfinch.cs.duke.edu";
printf("\nTesting CNgetinfo()...\n");
printf("\t[CNgetinfo = %p]\n", (void *)(tpl->CNgetinfo));
ret = resolve(host_name, NULL, &hostaddr, 1);
if (ret < 0) {
printf("resolve(\"%s\") returned error code %d: %s\n",
host_name, ret, get_err_text(ret));
return;
}
fd = TCP_open(hostaddr, 23, 0, 0);
if (fd < 0) {
printf("TCP_open() returned error code %d: %s\n", fd, get_err_text(fd));
return;
} else {
printf("TCP_open() returns socket handle %d\n", fd);
}
C = CNgetinfo(fd);
if (!C) {
printf("CNgetinfo(%d) returned NULL\n", fd);
} else {
printf("CNgetinfo(%d) returned {%u, %u, %u, %lu.%lu.%lu.%lu}\n",
fd, C->protocol, C->lport, C->rport,
(C->rhost>>24), (C->rhost>>16)&0xFFL, (C->rhost>>8)&0xFFL,
C->rhost&0xFFL);
}
ret = TCP_close(fd, 0);
if (ret < 0) {
printf("TCP_close(%d) returned error code %d: %s\n",
fd, ret, get_err_text(ret));
}
}
struct {
void (*func)(void);
const char *descr;
} tests[] = {
{errtext_test, "Test get_err_text()"},
{stikvar_test, "Test getvstr()"},
{mem_test, "Test the memory pool"},
{resolver_test, "Test the DNS resolver"},
{tcp_test, "Test the TCP functions"},
{NDB_test, "Test the TCP functions, with CNget_NDB() reads only"},
{CIB_test, "Test CNgetinfo()"}
};
#define NTESTS (sizeof(tests)/sizeof(*tests))
int main(int argc, char *argv[])
{
int i, n;
Supexec(init_drivers);
printf("STiK cookie returned a drivers value of %p\n",
(void *)drivers);
if (!drivers) {
printf("Hmph. That didn't work...\n");
exit(1);
}
printf("\ndrivers = {\"%s\", %p, %p, %p}\n", drivers->magic,
(void *)(drivers->get_dftab), (void *)(drivers->ETM_exec),
(void *)(drivers->cfg));
printf("drivers->cfg = {0x%08lx, 0x%08lx, %u, %u, %u, %u, %u,"
" %u, %u, %d, %d, %ld, %d}\n",
drivers->cfg->client_ip,
drivers->cfg->provider,
drivers->cfg->ttl,
drivers->cfg->ping_ttl,
drivers->cfg->mtu,
drivers->cfg->mss,
drivers->cfg->df_bufsize,
drivers->cfg->rcv_window,
drivers->cfg->def_rtt,
drivers->cfg->time_wait_time,
drivers->cfg->unreach_resp,
drivers->cfg->cn_time,
drivers->cfg->cd_valid);
if (strcmp(MAGIC, drivers->magic)) {
printf("Hmm... drivers->magic should have been \"%s\"\n", MAGIC);
return 1;
}
tpl = (TPL *)get_dftab(TRANSPORT_DRIVER);
printf("get_dftab(\"%s\") returns %p\n", TRANSPORT_DRIVER, (void *)tpl);
if (!tpl) {
printf("Well, durnit, what is this about?\n");
return 1;
}
printf("tpl = {\"%s\", \"%s\", \"%s\"}\n", tpl->module, tpl->author,
tpl->version);
if (argc <= 1) {
printf("\nYou didn't select any tests. The available tests are:\n");
for (i = 0; i < NTESTS; i++)
printf("\t%d: %s\n", i + 1, tests[i].descr);
} else {
for (i = 1; i < argc; i++) {
n = atoi(argv[i]);
if (n == 0 || n > NTESTS) {
printf("Unknown test \"%s\"\n", argv[i]);
continue;
}
(*tests[n - 1].func)();
}
}
return 0;
}